package com.example.thirdannotation.y2022.annotation.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author dangwen
 * 自定义注解常用的元注解（用于注解其他注解的特殊注解）有以下几种：
 *
 * @Retention: 指定注解的保留策略，包括三种取值：
 *
 * RetentionPolicy.SOURCE：注解仅保留在源代码中，编译时会被丢弃。
 * RetentionPolicy.CLASS：注解保留在编译后的字节码文件中，但不会被加载到 JVM 中，在运行时无法获取。
 * RetentionPolicy.RUNTIME：注解保留在编译后的字节码文件中，并且会被加载到 JVM 中，可通过反射机制在运行时获取。
 * @Target： 指定注解可以应用的目标元素类型，包括多种取值：
 *
 * ElementType.TYPE：可以用于类、接口、枚举等。
 * ElementType.FIELD：可以用于字段或属性。
 * ElementType.METHOD：可以用于方法。
 * ElementType.PARAMETER：可以用于方法参数。
 * 其他诸如 ElementType.CONSTRUCTOR、ElementType.LOCAL_VARIABLE 等。
 * @Documented： 指定注解是否被 javadoc 工具记录到文档中。
 *
 * @Inherited： 指定注解是否具有继承性，如果一个注解被 @Inherited 修饰，则标注该注解的类的子类会自动继承该注解。
 */
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { IntValuesConstraintValidator.class }) // 指定一个注解校验器
public @interface IntValues {
    /**
     * @return the error message template
     */
    String message() default "{com.example.thirdannotation.y2022.annotation.valid.IntValues.message}";

    /**
     * @return the groups the constraint belongs to
     */
    Class<?>[] groups() default { };

    /**
     * @return the payload associated to the constraint
     */
    Class<? extends Payload>[] payload() default { };

    int[] values() default { };
}